package com.javacoo.xservice.base;

import java.util.Optional;
import java.util.function.Supplier;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;

import com.javacoo.xservice.base.support.swaparea.SwapAreaUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 无业务参数控制器基类
 * <p>说明:</p>
 * <li>定义无业务参数接口处理基本流程</li>
 * <li>统一异常处理</li>
 * @author DuanYong
 * @since 2017年7月11日上午8:49:58
 */
@Slf4j
public abstract class AbstractNonParamController extends BaseController {
    /**
     * 具体业务处理
     * <p>说明:</p>
     * <li>由子类实现</li>
     * @author DuanYong
     * @return 业务返回数据
     * @since 2017年7月11日上午8:51:23
     */
    protected abstract Object process();
	/**
	 * 接口处理
	 * <p>说明:</p>
	 * <li>业务处理</li>
	 * <li>设置响应数据</li>
	 * @since 2017年7月11日上午9:13:28
	 */
	@RequestMapping
	private final void handle(HttpServletResponse httpServletResponse) {
		Long startTime = System.currentTimeMillis();
		//业务处理->设置响应数据
		Optional.ofNullable(execute()).map(o->setSuccessResponse(httpServletResponse,o));
		log.info("[{}]接口->{},处理完成,耗时->{}秒",SwapAreaUtils.getSwapAreaData().getTransactionSn(), SwapAreaUtils.getSwapAreaData().getReqMethod(),(System.currentTimeMillis() - startTime)/1000.0);
	}
	/**
	 * 执行
	 * <p>说明:</p>
	 * @author DuanYong
	 * @return: java.lang.Object 业务返回数据
	 * @since 2017年11月13日下午3:41:04
	 */
	private final Object execute(){
		return executeFunction.get();
	}
	/**
	 * 执行业务处理
	 */
	private Supplier<Object> executeFunction = ()-> process();
	
}
